﻿Public Class Barrio

    Enum estado
        insertar
        modificar
    End Enum

    Enum termino
        aprobado
        rechazado
    End Enum

    Dim primera_busqueda As Boolean
    Dim accion As estado = estado.insertar
    Dim _acceso As New acceso_a_datos

    Private Sub Barrio_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        primera_busqueda = False

        Me.btn_guardar.Enabled = False
        Me.btn_eliminar.Enabled = False
        Me.btn_buscar.Enabled = True

        Me.deshabilitarCampos()
        Me.carga_grilla()
    End Sub

    'Cargamos la Grilla
    Private Sub carga_grilla()

        Dim tabla As New Data.DataTable
        Dim txt_sql As String = ""

        txt_sql = "select * from  Barrio"
        tabla = Me._acceso._consulta(txt_sql)

        Me.grilla_barrio.Rows.Clear()

        'cargamos la grilla con un metodo
        Dim c As Integer = 0
        For c = 0 To tabla.Rows.Count - 1
            Me.grilla_barrio.Rows.Add(tabla.Rows(c)("cod_Barrio"), tabla.Rows(c)("nombre"), tabla.Rows(c)("descripcion"))
        Next

    End Sub

    'metodo para controlar que no se ingresen letras en el campo codigo del barrio
    Private Sub txt_codigo_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txt_codigo.KeyPress
        Select Case Asc(e.KeyChar)
            Case 1, 3, 5, 8, 24
                Exit Sub
        End Select

        If IsNumeric(e.KeyChar) = False Then
            MsgBox("Este caracter no es un numero (" + e.KeyChar + ")", vbCritical, "Importante")
            e.KeyChar = ""
        End If
    End Sub

    'metodo para evitar que se ingresen numeros en la descripcion del barrio
    Private Sub txt_descripcion_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txt_descripcion.KeyPress
        Select Case Asc(e.KeyChar)
            Case 2, 3, 45, 8, 12
                Exit Sub
        End Select

        If Not IsNumeric(e.KeyChar) = False Then
            MsgBox("Este caracter no es una letra ( " + e.KeyChar + ")", vbCritical, "Importante")
            e.KeyChar = ""
        End If
    End Sub

    'Metodo que habilita los campos para poder realizar la carga, eliminacion y modificacion.
    Private Sub habilitarCampos()
        Me.txt_nombre.Enabled = True
        Me.txt_descripcion.Enabled = True
        Me.txt_codigo.Enabled = True
    End Sub

    'Metodo que deshabilita los campos segun sea necesario.
    Private Sub deshabilitarCampos()

        Me.txt_nombre.Enabled = False
        Me.txt_descripcion.Enabled = False
        Me.txt_codigo.Enabled = False

    End Sub

    'Metodo para limpiar los campos
    Public Sub limpiar()

        Me.txt_nombre.Text = ""
        Me.txt_descripcion.Text = ""
        Me.txt_codigo.Text = ""
        'lbl_nombre_obligatorio.Visible = False
        'lbl_descripcion_obligatorio.Visible = False
        'lbl_codigo_obligatorio.Visible = False
        Me.txt_codigo.Focus()

    End Sub

    'BOTON SALIR
    Private Sub btn_salir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_salir.Click
        Me.Close()
    End Sub


    'BOTON NUEVO
    Private Sub btn_nuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_nuevo.Click

        Me.btn_buscar.Enabled = False
        Me.btn_eliminar.Enabled = False
        Me.btn_guardar.Enabled = True
        Me.btn_salir.Enabled = True

        Me.habilitarCampos()
        Me.txt_nombre.Focus()

        'Limpiamos campos General
        Me.limpiar()

        'bloqueamos el codigo y asignamos el proximo id
        Me.txt_codigo.Enabled = False
        Me.txt_codigo.Text = obtenerId() + 1

        'borrar una ves entes de implementar
        indicar_obligatorios(sender, e)

        Me.carga_grilla()

        Me.accion = estado.insertar
    End Sub

    'BOTON ELIMINAR
    Private Sub btn_eliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_eliminar.Click

        If txt_codigo.Text = "" Then
            MsgBox("Debe seleccionar un Barrio antes de borrar", MsgBoxStyle.Exclamation, "Atencion")
            Exit Sub
        End If

        If MsgBox("¿Realmente desea Borrar?", MsgBoxStyle.Question + MsgBoxStyle.YesNo, "Importante") = MsgBoxResult.No Then

            Me.btn_buscar.Enabled = True
            Me.btn_eliminar.Enabled = False
            Me.btn_guardar.Enabled = False
            Me.btn_salir.Enabled = True
            Me.deshabilitarCampos()
            limpiar()
            Exit Sub
        End If

        Me.eliminar()
        Me.carga_grilla()

        Me.btn_nuevo.Enabled = True
        Me.btn_eliminar.Enabled = False
        Me.btn_buscar.Enabled = True
        Me.btn_guardar.Enabled = False

        Me.deshabilitarCampos()
        limpiar()
    End Sub

    'BOTON GUARDAR
    Private Sub btn_guardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_guardar.Click

        'llamo a la funcion validar
        If Me.validar(sender, e) = True Then
            If Me.accion = estado.insertar Then
                If Me.validar_existencia() = termino.aprobado Then
                    Me.insertar()
                Else
                    MessageBox.Show("Ya esta registrado un barrio con estos datos", "Importante", MessageBoxButtons.OK, MessageBoxIcon.Error)
                    Exit Sub
                End If
            Else
                Me.modificar()
            End If

            Me.carga_grilla()

            MessageBox.Show("Se grabó exitosamente", "Felicidades", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)

            Me.btn_guardar.Enabled = False
            Me.btn_eliminar.Enabled = False
            Me.btn_buscar.Enabled = True
            Me.btn_nuevo.Enabled = True

            Me.deshabilitarCampos()
            Me.limpiar()
        End If
    End Sub

    'Funcion para validar Datos Ingresados
    Private Function validar(ByVal sender As System.Object, ByVal e As System.EventArgs) As Boolean
        If Me.txt_nombre.Text = "" Then
            'MessageBox.Show("Debe completar el campo Nombre", "IMPORTANTE", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
            indicar_obligatorios(sender, e)
            Me.txt_nombre.Focus()
            Return False
            Exit Function
        End If

        If Me.txt_descripcion.Text = "" Then
            'MessageBox.Show("Debe completar el campo Descripcion", "IMPORTANTE", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
            indicar_obligatorios(sender, e)
            Me.txt_descripcion.Focus()
            Return False
            Exit Function
        End If

        Return True
    End Function

    'Validamos la existencia del Barrio en la Base de Datos 
    Private Function validar_existencia() As termino

        Dim consulta As String = ""
        Dim tabla As New Data.DataTable

        consulta = "SELECT * FROM Barrio "
        consulta &= "WHERE cod_Barrio=" & Me.txt_codigo.Text

        tabla = Me._acceso._consulta(consulta)

        'Vemos si hay algo en las FILAS
        If tabla.Rows.Count() = 1 Then
            Return termino.rechazado
        Else
            Return termino.aprobado
        End If

    End Function

    'Funcion para insertar.
    Private Function insertar() As termino

        Dim consulta As String = ""
        Dim tabla As New Data.DataTable

        'inserta en la tabla Barrio los datos tomados del Formulario...
        consulta = "cod_Barrio=" & Me.txt_codigo.Text
        consulta &= ", nombre=" & Me.txt_nombre.Text
        consulta &= ", descripcion=" & Me.txt_descripcion.Text

        Me._acceso._tabla = "Barrio"
        Me._acceso._insertar_c(consulta)

        Return termino.aprobado
    End Function

    'Funcion Modificar
    Private Function modificar() As termino

        Dim modificacion As String = ""

        modificacion = "nombre=" & Me.txt_nombre.Text
        modificacion &= ", descripcion=" & Me.txt_descripcion.Text

        Me._acceso._tabla = "Barrio"
        Me._acceso._modificar(modificacion, "cod_Barrio=" & Me.txt_codigo.Text)
        Me.carga_grilla()

        Return termino.aprobado
    End Function

    'obtener ultimo id de la tabla Barrio en la BD
    Public Function obtenerId() As Integer
        Dim tabla

        Try
            tabla = _acceso._consulta("SELECT MAX(cod_Barrio) AS id FROM Barrio")

            If tabla.Rows.Count = 1 Then
                Return tabla.Rows(0)("id")
            Else
                Return 0
            End If
        Catch ex As InvalidCastException
            Return 0
        End Try
    End Function

    'Funcion Eliminar
    Private Function eliminar() As termino

        Dim eliminar_sql As String = ""
        Dim consulta_sql As String = ""
        Dim tabla As New Data.DataTable

        'buscamos si el barrio esta asignado a algun empleado
        consulta_sql = "SELECT * FROM Empleado WHERE cod_Barrio = " & Me.txt_codigo.Text

        Try
            tabla = _acceso._consulta(consulta_sql)
        Catch ex As Exception
            MsgBox(ex.Message)
            Return termino.rechazado
            Exit Function
        End Try

        If tabla.Rows.Count = 1 Then
            MsgBox("El Barrio que desea eliminar esta asignado a un Empleado", vbExclamation, "Atencion")
            Return termino.rechazado
            Exit Function
        End If


        'eliminamos el barrio si es que no esta asignado a ningun empleado
        eliminar_sql = "DELETE FROM Barrio WHERE cod_Barrio=" & Me.txt_codigo.Text

        Try
            Me._acceso._borrar(eliminar_sql)
        Catch ex As Exception
            MsgBox(ex.Message)
            Return termino.rechazado
            Exit Function
        End Try

        Me.carga_grilla()
        Me.deshabilitarCampos()
        limpiar()

        Return termino.aprobado
    End Function

    'metodo que me permite obtener los datos de la grilla para despues hacer la Eliminacion y modificacion de los datos en la BD...
    Private Sub grilla_barrio_CellDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles grilla_barrio.CellDoubleClick

        Dim codi As Integer = Me.grilla_barrio.CurrentRow.Cells("Codigo").Value
        Dim consulta_sql As String

        Dim tabla As New Data.DataTable

        consulta_sql = "SELECT * FROM Barrio WHERE cod_Barrio=" & codi

        Me._acceso._tabla = "Barrio"
        tabla = Me._acceso._consulta(consulta_sql)

        'habilito algunos botones...
        Me.btn_guardar.Enabled = True
        Me.btn_eliminar.Enabled = True
        Me.btn_buscar.Enabled = False

        'habilito/deshabilito algunos campos...
        Me.txt_nombre.Enabled = True
        Me.txt_descripcion.Enabled = True
        Me.txt_codigo.Enabled = False

        'cargo los datos de la BD en los campos del Formulario...
        Me.txt_codigo.Text = codi
        Me.txt_nombre.Text = tabla.Rows(0)("nombre")
        Me.txt_descripcion.Text = tabla.Rows(0)("descripcion")

        indicar_obligatorios(sender, e)
        Me.accion = estado.modificar
    End Sub

    'evento del boton buscar..
    'podemos buscar un barrio por su nombre, codigo o por los dos parametros..
    Private Sub btn_buscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_buscar.Click
        Me.txt_descripcion.Enabled = False
        Me.txt_nombre.Enabled = True
        Me.txt_codigo.Enabled = True
        Me.txt_codigo.Focus()

        If Me.txt_codigo.Text = "" And Me.txt_nombre.Text = "" And Me.txt_nombre.Enabled = True And Me.primera_busqueda = True Then
            MsgBox("Primero debe ingresar el Codigo o nombre del Barrio ", vbExclamation, "Atencion")
        End If

        If Me.txt_codigo.Text <> "" And Me.txt_nombre.Text <> "" Then
            Me.buscar_por_codigo_nombre()
        End If

        If Me.txt_codigo.Text = "" And Me.txt_nombre.Text <> "" Then
            Me.buscar_por_nombre()
        End If

        If Me.txt_codigo.Text <> "" And Me.txt_nombre.Text = "" Then
            Me.buscar_por_codigo()
        End If

        Me.primera_busqueda = True
    End Sub

    Private Sub buscar_por_codigo()

        Dim cons As String = ""
        Me._acceso._tabla = "Barrio"

        Dim tabla As New Data.DataTable

        If Me.txt_codigo.Text <> "" And Me.txt_nombre.Text = "" Then
            cons = "SELECT * FROM Barrio WHERE cod_Barrio =" & Me.txt_codigo.Text

            tabla = Me._acceso._consulta(cons)

            Me.grilla_barrio.Rows.Clear()

            If tabla.Rows.Count <> 0 Then
                Me.grilla_barrio.Rows.Add(tabla.Rows(0)("cod_Barrio"), tabla.Rows(0)("nombre"), tabla.Rows(0)("descripcion"))
                Me.txt_codigo.Text = ""
                Me.txt_codigo.Focus()
                Exit Sub
            Else
                MsgBox("No se encontro ningun barrio con ese codigo", vbExclamation, "Importante")
                Me.txt_codigo.Text = ""
                Me.txt_codigo.Focus()
            End If
        End If
    End Sub

    Private Sub buscar_por_nombre()
        Dim cons As String = ""
        Me._acceso._tabla = "Barrio"

        Dim tabla As New Data.DataTable

        If Me.txt_codigo.Text = "" And Me.txt_nombre.Text <> "" Then

            cons = "SELECT * FROM Barrio WHERE nombre LIKE '" & Me.txt_nombre.Text & "%' COLLATE SQL_LATIN1_GENERAL_CP1_CI_AI"

            tabla = Me._acceso._consulta(cons)

            Me.grilla_barrio.Rows.Clear()

            If tabla.Rows.Count <> 0 Then
                Me.grilla_barrio.Rows.Add(tabla.Rows(0)("cod_Barrio"), tabla.Rows(0)("nombre"), tabla.Rows(0)("descripcion"))
                Me.txt_nombre.Text = ""
                Me.txt_codigo.Focus()
                Exit Sub
            Else
                MsgBox("No se encontro ningun barrio con ese nombre", vbExclamation, "Importante")
                Me.txt_nombre.Text = ""
                Me.txt_nombre.Focus()
            End If
        End If
    End Sub

    Private Sub buscar_por_codigo_nombre()
        Dim cons As String = ""
        Me._acceso._tabla = "Barrio"

        Dim tabla As New Data.DataTable

        If Me.txt_codigo.Text <> "" And Me.txt_nombre.Text <> "" Then
            cons = "SELECT * FROM Barrio WHERE cod_Barrio =" & Me.txt_codigo.Text
            cons &= " and nombre LIKE '" & Me.txt_nombre.Text & "'"

            tabla = Me._acceso._consulta(cons)

            Me.grilla_barrio.Rows.Clear()

            If tabla.Rows.Count <> 0 Then
                Me.grilla_barrio.Rows.Add(tabla.Rows(0)("cod_Barrio"), tabla.Rows(0)("nombre"), tabla.Rows(0)("descripcion"))
                Me.txt_nombre.Text = ""
                Me.txt_codigo.Text = ""
                Me.txt_nombre.Focus()
                Exit Sub
            Else
                MsgBox("No se encontro ningun barrio con el codigo o nombre especificado", vbExclamation, "Importante")
                Me.txt_codigo.Text = ""
                Me.txt_nombre.Text = ""
                Me.txt_nombre.Focus()
            End If
        End If
    End Sub


    Private Sub txt_codigo_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txt_codigo.Leave
        If txt_codigo.Text = "" And btn_salir.Focused = False Then
            lbl_codigo_obligatorio.Visible = True
        Else
            lbl_codigo_obligatorio.Visible = False
        End If
    End Sub

    Private Sub txt_nombre_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txt_nombre.Leave
        If txt_nombre.Text = "" And btn_salir.Focused = False Then
            lbl_nombre_obligatorio.Visible = True
        Else
            lbl_nombre_obligatorio.Visible = False
        End If
    End Sub

    Private Sub txt_descripcion_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txt_descripcion.Leave
        If txt_descripcion.Text = "" And btn_salir.Focused = False Then
            lbl_descripcion_obligatorio.Visible = True
        Else
            lbl_descripcion_obligatorio.Visible = False
        End If
    End Sub
    'Para que se prendan todas juntas
    Public Sub indicar_obligatorios(ByVal sender As System.Object, ByVal e As System.EventArgs)
        txt_codigo_Leave(sender, e)
        txt_nombre_Leave(sender, e)
        txt_descripcion_Leave(sender, e)
    End Sub


    Private Sub Barrio_FormClosed(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed
        Dispose()
    End Sub
End Class